package com.hdu.metrics_center.redisCommand;


import com.hdu.metrics_center.enums.RedisCommandType;
import com.hdu.metrics_center.metrics.MetricsValue;
import com.hdu.metrics_center.utils.JedisUtils;
import com.hdu.metrics_center.metrics.MetricsExecuteReq;
import com.hdu.metrics_center.metrics.MetricsExecuteResult;
import com.hdu.metrics_center.utils.StringUtils;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

import static com.alibaba.fastjson.JSON.parseObject;
import static com.hdu.metrics_center.enums.MetricsQueryResultType.METRICS_VALUE;
import static com.hdu.metrics_center.enums.MetricsQueryResultType.NUM;
import static java.lang.Long.parseLong;

@Component
public class HGetRedisCommand implements RedisCommand {
    @Override
    public RedisCommandType support() {
        return RedisCommandType.HGET;
    }

    @Override
    public MetricsExecuteResult operate(MetricsExecuteReq metricsExecuteReq) {
        Jedis jedis = JedisUtils.getJedis();
        String value = jedis.hget(metricsExecuteReq.getKey(), metricsExecuteReq.getField());
        /**
         *   因为如果调用 HINCRBY 的时候 value 只能是一个数字
         *   调用 HSET 的时候, value 是一个结构体 MetricsValue
         */
        boolean isDigit = StringUtils.isDigit(value);
        return MetricsExecuteResult
                .builder()
                .value(isDigit ? parseLong(value) : parseObject(value, MetricsValue.class))
                .type(isDigit ? NUM : METRICS_VALUE)
                .reqUuid(metricsExecuteReq.getReqUuid())
                .build();
    }
}
